Problem
Time limit : 2sec / Memory limit : 256MB
求一个$k$的倍数使其数位和最小,输出数位和,$k \leqslant 10^5$。
Solution
考虑极端情况数字是可能爆long long
甚至__int128
这种东西的
所以思考的方向是对于数位进行处理
考虑每一个数都能从$1$通过以下两种操作来得到:
- 乘$10$,数位和不变
- 加$1$,并且数位和$+1$
在$\text{mod}\ k$的意义下进行计算,把$0 \sim k-1$中的每一个数看成一个点,$i$向$i+1$连一条权值为$1$的边,$i$向$10i$连一条权值为$0$的边,从$1$到$0$跑最短路即可
这时有一个问题,上面说了,$+1$的时候必须保证数位和$+1$,所以连续走$10$次及以上权值为$1$的边是不合法的。但可以发现这样走一定不是最短路(可以在乘$10$之前走$1$步然后再乘$10$),所以不影响答案。
我们其实也可以得到一种等价的做法:
$k$个点表示$\text{mod}\ k=0\sim k-1$的最小数字和,起点是$1\sim k-1(d_i=i)$,终点为$0$,$x$向$(x*10+0 \sim 9) \text{mod}\ k$连边权为$0\sim 9$的边,跑最短路。
Code:
1 |
|